; haribote-ipl
; TAB=4
CYLS	EQU		10				; 定义常量CYLS = 10
		ORG		0x7c00			; 

; 写入软盘信息

		JMP		entry
		DB		0x90
		DB		"HARIBOTE"		; 
		DW		512				; 
		DB		1				; 
		DW		1				; 
		DB		2				; 
		DW		224				; 
		DW		2880			; 
		DB		0xf0			; 
		DW		9				; 
		DW		18				; 
		DW		2				; 
		DD		0				; 
		DD		2880			; 
		DB		0,0,0x29		; 
		DD		0xffffffff		; 
		DB		"HARIBOTEOS "	; 
		DB		"FAT12   "		; 
		RESB	18				; 


; 程序主体
entry:
		MOV		AX,0			; AX = 0
		MOV		SS,AX			; SS = AX
		MOV		SP,0x7c00		; SP = 0x7c00
		MOV		DS,AX			; DS = AX

; AX = SS = DS = 0 ;默认指定DS段寄存器
; 目前没有用到段寄存器，所以设置DS = 0
; SP = 0x7c00

; CH、CL、DH、DL分别是柱面号、扇区号、磁头号驱动器号

		MOV		AX,0x0820		;
		MOV		ES,AX			; ES=0x0820
		MOV		CH,0			; 柱面号
		MOV		DH,0			; 磁头号
		MOV		CL,2			; 扇区号
readloop:						;重置失败回数
		MOV		SI,0			;记录失败回数

retry:
;AH=0x02;（读盘）
;AH=0x03;（写盘）
;AH=0x04;（校验）
;AH=0x0c;（寻道）

		MOV		AH,0x02			; (AH = 0x02)读盘
		MOV		AL,1			; AL=处理对象的扇区数;（只能同时处理连续的扇区）
		MOV		BX,0			; ES:BX=缓冲地址；(校验及寻道时不使用)
		MOV		DL,0x00			; DL=驱动器号；
		INT		0x13			; 调用0x13函数
		JNC		next				;是“Jumpif not carry”的缩写。
								;也就是说进位标志是0的话就跳转
								;就是说没有错误就跳转到next(准备下一次读取)
		;JC		error			; JC，是“jump if carry”的缩写，
		;如果没有读取成功		;意思是如果进位标志（carry flag）是1的话，就跳转
		ADD SI,1 				;往SI加1
		CMP SI,5 				;比较SI与5
		JAE error 				; SI >= 5时，跳转到error;JAE也是条件跳
								;转，是“Jump if above or equal”的缩写，
								;意思是大于或等于时跳转。
;系统复位函数 它的功能是复位软盘状态
		MOV AH,0x00
		MOV DL,0x00 			; A驱动器
		INT 0x13 				; 重置驱动器
		JMP retry

						
;返回值：
;FLACS.CF==0：没有错误，AH==0
;FLAGS.CF==1：有错误，错误号码存入AH内（与重置（reset）
;功能一样）



next:
		MOV		AX,ES			
		ADD		AX,0x0020
		MOV		ES,AX			;把内存地址后移0x200 相当于ES+=0x0020
		ADD		CL,1			; CL+=1
		CMP		CL,18			; 比较CL与18 (CL是扇区号)
		JBE		readloop		; CL <= 18 比较CL和18 
								; 如果CL <= 18，则跳转至readloop
								; 如果>18

		MOV		CL,1			;CL=1	
		ADD		DH,1			;DH+=1 (DH是磁头号)
		CMP		DH,2
		JB		readloop		; 如果DH < 2，则跳转至readloop
		MOV		DH,0
		ADD		CH,1
		CMP		CH,CYLS
		JB		readloop		; CH<10 则跳转至readloop

; 接下来跳转到系统区

		MOV		[0x0ff0],CH		; 将CYLS的值写到内存地址0x0ff0中。
								; 把磁盘装载内容的结束地址告诉给haribote.sys
		JMP		0xc200

; 


; 如果有erroe
; 调用打印功能
error:
		MOV		SI,msg
putloop:
		MOV		AL,[SI]
		ADD		SI,1			; 
		CMP		AL,0
		JE		fin
		MOV		AH,0x0e			; 
		MOV		BX,15			; 
		INT		0x10			; 调用bios 0x10 函数
		JMP		putloop
fin:
		HLT						; 
		JMP		fin				; 
msg:
		DB		0x0a, 0x0a		; 
		DB		"load error"
		DB		0x0a			; 
		DB		0

		RESB	0x7dfe-($-$$)		; 

		DB		0x55, 0xaa
